package servico;

import dao.PrescricaoDAO;
import dao.fabrica.FabricaDeDAOs;
import excecao.AplicacaoException;
import excecao.ObjetoDuplicadoException;
import excecao.ObjetoNaoEncontradoException;
import java.util.List;
import modelo.Medicamento;
import modelo.Medico;
import modelo.Prescricao;
import modelo.Residente;
import util.MedicamentoDosagemDecorado;

public class PrescricaoAppService {

    private static PrescricaoDAO PrescricaoDAO = FabricaDeDAOs.getDAO(PrescricaoDAO.class);
    private MedicamentoAppService medService;
    private Prescricao prescricao;
    MedicamentoDosagemDecorado medicamentoDosagem = null;

    public void inclui(Prescricao umaPrescricao) throws AplicacaoException {
        try {
            PrescricaoDAO.inclui(umaPrescricao);

        } catch (ObjetoDuplicadoException e) {
            throw new AplicacaoException("Prescrição já cadastrada");
        }

    }

    public void altera(Prescricao umaPrescricao)
            throws AplicacaoException {
        try {

            PrescricaoDAO.altera(umaPrescricao);

        } catch (ObjetoNaoEncontradoException e) {

            throw new AplicacaoException("Prescricao não encontrada");
        }
    }

    public void exclui(Prescricao umaPrescricao)
            throws AplicacaoException {
        try {

            PrescricaoDAO.exclui(umaPrescricao);

        } catch (ObjetoNaoEncontradoException e) {

            throw new AplicacaoException("Prescricao não encontrada");
        }
    }

    public Prescricao recuperaUmaPrescricao(long idPrescricao)
            throws AplicacaoException {
        try {

            Prescricao prescricao = PrescricaoDAO.recuperaUmaPrescricao(idPrescricao);

            return prescricao;
        } catch (ObjetoNaoEncontradoException e) {

            throw new AplicacaoException("Usuario não encontrado");
        }
    }

    public List<Prescricao> recuperaPrescricaoResidente(Residente residente) {
        List<Prescricao> prescricoes = recuperaPrescricoes();
        List<Prescricao> prescricoesResidentes = null;
        for (Prescricao prescricao : prescricoes) {
            if (prescricao.getResidente().igual(residente)) {
                prescricoesResidentes.add(prescricao);
            }
        }

        return prescricoesResidentes;
    }

    public List<Prescricao> recuperaPrescricoes() {
        List<Prescricao> prescricao = null;

        prescricao = PrescricaoDAO.recuperaPrescricoes();

        return prescricao;
    }

    public boolean adicionaMedicamentoPrescricao(Medicamento medicamento, Integer dosagem) throws AplicacaoException {
        boolean vinculado = false;
        medicamentoDosagem.setDosagem(dosagem);
        medicamentoDosagem.setMedicamento(medicamento);

        //decrementar estoque do medicamento
        vinculado = medService.decrementaMedicamento(dosagem, medicamento);
        if (vinculado) {
            prescricao.getMedicamentosDosagens().add(medicamentoDosagem);
        }

        return vinculado;

    }

    public void vinculaMedicamentoResidente(Residente residente, Medico medico, Prescricao umaPrescricao) throws AplicacaoException {

            umaPrescricao.setMedicamentosDosagens(prescricao.getMedicamentosDosagens());
            umaPrescricao.setMedico(medico);
            umaPrescricao.setResidente(residente);

            inclui(umaPrescricao);

    }
}